﻿Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Drawing
Imports System.IO
Imports System.Linq
Imports System.Text.RegularExpressions
Imports System.Web
Imports System.Xml.Serialization

Namespace roncliProductions.LibWowArmory

    ''' <summary>
    ''' A class that gets a character's information from the Armory
    ''' </summary>
    ''' <remarks></remarks>
    Public Class CharacterSheet
        Inherits WowArmoryXML

#Region "Declarations"

        Private csPage As New CharacterSheetSchema.page
        Private strRealm As String
        Private strName As String

#End Region

#Region "Properties"

        ''' <summary>
        ''' The realm the character is on
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property Realm() As String
            Get
                Return strRealm
            End Get
            Set(ByVal value As String)
                strRealm = value
            End Set
        End Property

        ''' <summary>
        ''' The name of the character
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property Name() As String
            Get
                Return strName
            End Get
            Set(ByVal value As String)
                strName = value
            End Set
        End Property

        ''' <summary>
        ''' The URL that will be used to retrieve the character from the Armory
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides ReadOnly Property URL() As String
            Get
                Return String.Format("http://www.wowarmory.com/character-sheet.xml?r={0}&n={1}", strRealm, strName)
            End Get
        End Property

        ''' <summary>
        ''' The battlegroup the character is a part of
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property BattleGroup() As String
            Get
                Return GetCharacter().battleGroup
            End Get
        End Property

        ''' <summary>
        ''' The character's class
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property [Class]() As ClassType
            Get
                Return CType(GetCharacter().classId, ClassType)
            End Get
        End Property

        ''' <summary>
        ''' The character's faction
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Faction() As FactionType
            Get
                Return CType(GetCharacter().factionId, FactionType)
            End Get
        End Property

        ''' <summary>
        ''' The character's gender
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Gender() As GenderType
            Get
                Return CType(GetCharacter().genderId, GenderType)
            End Get
        End Property

        ''' <summary>
        ''' The name of the character's guild
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property GuildName() As String
            Get
                Return GetCharacter().guildName
            End Get
        End Property

        ''' <summary>
        ''' The date this character was last modified on the Armory
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property LastModified() As Date
            Get
                Return CDate(GetCharacter().lastModified)
            End Get
        End Property

        ''' <summary>
        ''' The character's level
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Level() As Integer
            Get
                Return GetCharacter().level
            End Get
        End Property

        ''' <summary>
        ''' The number of achievement points the character has
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property AchievementPoints() As Integer
            Get
                Return GetCharacter().points
            End Get
        End Property

        ''' <summary>
        ''' The character's prefix
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Prefix() As String
            Get
                Return GetCharacter().prefix
            End Get
        End Property

        ''' <summary>
        ''' The character's race
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Race() As RaceType
            Get
                Return CType(GetCharacter().raceId, RaceType)
            End Get
        End Property

        ''' <summary>
        ''' The character's suffix
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Suffix() As String
            Get
                Return GetCharacter().suffix
            End Get
        End Property

        ''' <summary>
        ''' The character's arena teams
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property ArenaTeams() As List(Of ArenaTeam)
            Get
                Dim cCharacter As CharacterSheetSchema.characterInfo_character = GetCharacter()
                If cCharacter.arenaTeams.Count = 0 Then
                    Return New List(Of ArenaTeam)
                Else
                    Return (From t In cCharacter.arenaTeams.First().arenaTeam Select New ArenaTeam((From m In t.members.First().character Select New ArenaTeam.Member(CType(m.classId, ClassType), m.contribution, m.gamesPlayed, m.gamesWon, CType(m.genderId, GenderType), m.guild, m.name, CType(m.raceId, RaceType), m.seasonGamesPlayed, m.seasonGamesWon, CBool(1 - m.teamRank))).ToList(), t.gamesPlayed, t.gamesWon, t.lastSeasonRanking, t.name, t.ranking, t.rating, t.seasonGamesPlayed, t.seasonGamesWon, t.size, GetColorFromHex(t.emblem.First().background), GetColorFromHex(t.emblem.First().borderColor), t.emblem.First().borderStyle, GetColorFromHex(t.emblem.First().iconColor), t.emblem.First().iconStyle)).ToList()
                End If
            End Get
        End Property

        ''' <summary>
        ''' The number of talent points the player has put into a tree
        ''' </summary>
        ''' <param name="intTree">The number of the talent tree, 1, 2, or 3.  Talent trees are always ordered from left to right on the talent sheet, and are always ordered in alphabetical order.</param>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property TalentPoints(ByVal intTree As Integer) As Integer
            Get
                Dim ctCharacter As CharacterSheetSchema.characterTab = GetCharacterTab()
                Select Case intTree
                    Case 1
                        Return ctCharacter.talentSpec.First().treeOne
                    Case 2
                        Return ctCharacter.talentSpec.First().treeTwo
                    Case 3
                        Return ctCharacter.talentSpec.First().treeThree
                    Case Else
                        Throw New ArgumentException("Can only select talent tree 1, 2, or 3.")
                End Select
            End Get
        End Property

        ''' <summary>
        ''' The number of lifetime honorable kills the character has
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property LifetimeHonorKills() As Integer
            Get
                Return GetCharacterTab.pvp.First().lifetimehonorablekills.First().value
            End Get
        End Property

        ''' <summary>
        ''' The number of arena points the character has
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property ArenaPoints() As Integer
            Get
                Return GetCharacterTab.pvp.First().arenacurrency.First().value
            End Get
        End Property

        ''' <summary>
        ''' The professions known by the character
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Professions() As List(Of Profession)
            Get
                Dim cCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If cCharacterTab.professions.Count = 0 Then
                    Return New List(Of Profession)
                Else
                    Return (From s In cCharacterTab.professions.First().skill Select New Profession(s.max, s.name, s.value)).ToList()
                End If
            End Get
        End Property

        ''' <summary>
        ''' Returns the character's title
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Title() As String
            Get
                Dim cCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If cCharacterTab.title.Count = 0 Then
                    Return Nothing
                Else
                    Return cCharacterTab.title.First().value.Replace("%s", strName)
                End If
            End Get
        End Property

        ''' <summary>
        ''' A list of titles known by the character
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property KnownTitles() As List(Of String)
            Get
                Dim cCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If cCharacterTab.knownTitles.Count = 0 Then
                    Return New List(Of String)
                Else
                    Return (From t In cCharacterTab.knownTitles.First().title Select t.value.Replace("%s", strName)).ToList()
                End If
            End Get
        End Property

        ''' <summary>
        ''' The amount of health the character has
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Health() As Integer
            Get
                Dim cbCharacterBars As CharacterSheetSchema.characterBars = GetCharacterBars()
                If IsNothing(cbCharacterBars) Then
                    Return Nothing
                Else
                    If cbCharacterBars.health.Count = 0 Then
                        Return Nothing
                    Else
                        Return cbCharacterBars.health.First().effective
                    End If
                End If
            End Get
        End Property

        ''' <summary>
        ''' The amount of mana, rage, energy, or runic power the character has
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Power() As Integer
            Get
                Dim sbSecondBar As CharacterSheetSchema.secondBar = GetSecondBar()
                If IsNothing(sbSecondBar) Then
                    Return Nothing
                Else
                    Return sbSecondBar.effective
                End If
            End Get
        End Property

        ''' <summary>
        ''' The type of power that the character has
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property PowerType() As String
            Get
                Dim sbSecondBar As CharacterSheetSchema.secondBar = GetSecondBar()
                If IsNothing(sbSecondBar) Then
                    Return Nothing
                Else
                    Select Case sbSecondBar.type
                        Case "m"
                            Return "Mana"
                        Case "r"
                            Return "Rage"
                        Case "e"
                            Return "Energy"
                        Case "p"
                            Return "Runic Power"
                        Case Else
                            Return Nothing
                    End Select
                End If
            End Get
        End Property

        ''' <summary>
        ''' The character's base stats
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Stats() As BaseStats
            Get
                Dim ctCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If IsNothing(ctCharacterTab) Then
                    Return Nothing
                Else
                    Return (From b In ctCharacterTab.baseStats Select New BaseStats( _
                        (From s In b.strength Select New BaseStats.StrengthStats(s.attack, s.base, s.block, s.effective)).First(), _
                        (From a In b.agility Select New BaseStats.AgilityStats(a.armor, a.attack, a.base, a.critHitPercent, a.effective)).First(), _
                        (From s In b.stamina Select New BaseStats.StaminaStats(s.base, s.effective, s.health, s.petBonus)).First(), _
                        (From i In b.intellect Select New BaseStats.IntellectStats(i.base, i.critHitPercent, i.effective, i.mana, i.petBonus)).First(), _
                        (From s In b.spirit Select New BaseStats.SpiritStats(s.base, s.effective, s.healthRegen, s.manaRegen)).First(), _
                        (From a In b.armor Select New BaseStats.ArmorStats(a.base, a.effective, a.percent, a.petBonus)).First())).First()
                End If
            End Get
        End Property

        ''' <summary>
        ''' Information about the character's spell resistance
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Resistances() As ResistanceStats
            Get
                Dim ctCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If IsNothing(ctCharacterTab) Then
                    Return Nothing
                Else
                    Return (From r In ctCharacterTab.resistances Select New ResistanceStats( _
                            (From a In r.arcane Select New ResistanceStats.Resistance(a.petBonus, a.value)).First(), _
                            (From f In r.fire Select New ResistanceStats.Resistance(f.petBonus, f.value)).First(), _
                            (From f In r.frost Select New ResistanceStats.Resistance(f.petBonus, f.value)).First(), _
                            (From h In r.holy Select New ResistanceStats.Resistance(h.petBonus, h.value)).First(), _
                            (From n In r.nature Select New ResistanceStats.Resistance(n.petBonus, n.value)).First(), _
                            (From s In r.shadow Select New ResistanceStats.Resistance(s.petBonus, s.value)).First())).First()
                End If
            End Get
        End Property

        ''' <summary>
        ''' Information about the character's melee stats
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Melee() As MeleeStats
            Get
                Dim ctCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If IsNothing(ctCharacterTab) Then
                    Return Nothing
                Else
                    Return (From m In ctCharacterTab.melee Select New MeleeStats( _
                            New WeaponStats(m.mainHandDamage.First().dps, m.mainHandDamage.First().max, m.mainHandDamage.First().min, m.mainHandDamage.First().percent, m.mainHandDamage.First().speed, m.mainHandSpeed.First().hastePercent, m.mainHandSpeed.First().hasteRating), _
                            New WeaponStats(m.offHandDamage.First().dps, m.offHandDamage.First().max, m.offHandDamage.First().min, m.offHandDamage.First().percent, m.offHandDamage.First().speed, m.offHandSpeed.First().hastePercent, m.offHandSpeed.First().hasteRating), _
                            (From p In m.power Select New MeleeStats.AttackPowerStats(p.base, p.effective, p.increasedDPS)).First(), _
                            (From h In m.hitRating Select New HitRatingStats(h.increasedHitPercent, h.penetration, h.reducedArmorPercent, h.value)).First(), _
                            (From c In m.critChance Select New CritChanceStats(c.percent, c.plusPercent, c.rating)).First(), _
                            (From e In m.expertise Select New MeleeStats.ExpertiseStats(e.additional, e.percent, e.rating, e.value)).First())).First()
                End If
            End Get
        End Property

        ''' <summary>
        ''' Information about the character's ranged stats
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Ranged() As RangedStats
            Get
                Dim ctCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If IsNothing(ctCharacterTab) Then
                    Return Nothing
                Else
                    Return (From r In ctCharacterTab.ranged Select New RangedStats( _
                            (From w In r.weaponSkill Select New RangedStats.WeaponSkillStats(w.rating, w.value)).First(), _
                            New WeaponStats(r.damage.First().dps, r.damage.First().max, r.damage.First().min, r.damage.First().percent, r.damage.First().speed, r.speed.First().hastePercent, r.speed.First().hasteRating), _
                            (From p In r.power Select New RangedStats.AttackPowerStats(p.base, p.effective, p.increasedDps, p.petAttack, p.petSpell)).First(), _
                            (From h In r.hitRating Select New HitRatingStats(h.increasedHitPercent, h.penetration, h.reducedArmorPercent, h.value)).First(), _
                            (From c In r.critChance Select New CritChanceStats(c.percent, c.plusPercent, c.rating)).First())).First()
                End If
            End Get
        End Property

        ''' <summary>
        ''' Information about the character's spell stats
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Spell() As SpellStats
            Get
                Dim ctCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If IsNothing(ctCharacterTab) Then
                    Return Nothing
                Else
                    Return (From s In ctCharacterTab.spell Select New SpellStats( _
                            New SpellStats.SpellPowerStats(s.bonusDamage.First().arcane.First().value, s.bonusDamage.First().fire.First().value, s.bonusDamage.First().frost.First().value, s.bonusDamage.First().holy.First().value, s.bonusDamage.First().nature.First().value, s.bonusDamage.First().shadow.First().value, s.bonusHealing.First().value), _
                            s.bonusDamage.First().petBonus.First().attack, _
                            s.bonusDamage.First().petBonus.First().damage, _
                            s.bonusDamage.First().petBonus.First().fromType, _
                            (From h In s.hitRating Select New SpellStats.SpellHitRatingStats(h.increasedHitPercent, h.penetration, h.reducedResist, h.value)).First(), _
                            (From c In s.critChance Select New SpellStats.SpellCritChanceStats(c.rating, c.arcane.First().percent, c.fire.First().percent, c.frost.First().percent, c.holy.First().percent, c.nature.First().percent, c.shadow.First().percent)).First(), _
                            s.manaRegen.First().casting, _
                            s.manaRegen.First().notCasting, _
                            s.hasteRating.First().hastePercent, _
                            s.hasteRating.First().hasteRating)).First()
                End If
            End Get
        End Property

        ''' <summary>
        ''' Information about the character's defensive stats
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Defense() As DefensiveStats
            Get
                Dim ctCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If IsNothing(ctCharacterTab) Then
                    Return Nothing
                Else
                    Return (From d In ctCharacterTab.defenses Select New DefensiveStats( _
                            (From def In d.defense Select New DefensiveStats.DefenseStats(def.decreasePercent, def.increasePercent, def.plusDefense, def.rating, def.value)).First(), _
                            (From dod In d.dodge Select New DefensiveStats.AvoidanceStats(dod.increasePercent, dod.percent, dod.rating)).First(), _
                            (From p In d.parry Select New DefensiveStats.AvoidanceStats(p.increasePercent, p.percent, p.rating)).First(), _
                            (From b In d.block Select New DefensiveStats.AvoidanceStats(b.increasePercent, b.percent, b.rating)).First(), _
                            (From r In d.resilience Select New DefensiveStats.ResilienceStats(r.damagePercent, r.hitPercent, r.value)).First())).First()
                End If
            End Get
        End Property

        ''' <summary>
        ''' The character's equipped items
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Items() As List(Of Item)
            Get
                Dim ctCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
                If IsNothing(ctCharacterTab) Then
                    Return New List(Of Item)
                Else
                    If IsNothing(ctCharacterTab.items) Then
                        Return New List(Of Item)
                    Else
                        Return (From i In ctCharacterTab.items.First().item Select New Item(i.durability, i.gem0Id, i.gem1Id, i.gem2Id, i.icon, i.id, i.maxDurability, i.permanentEnchant, i.randomPropertiesId, i.seed, i.slot)).ToList()
                    End If
                End If
            End Get
        End Property

        ''' <summary>
        ''' The character's talents
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Talents() As Talents
            Get
                Return New CharacterTalents(strRealm, strName).Talents
            End Get
        End Property

#End Region

#Region "Public Methods"

        ''' <summary>
        ''' A constructor to load a character by realm and character name
        ''' </summary>
        ''' <param name="strRealm"></param>
        ''' <param name="strName"></param>
        ''' <remarks></remarks>
        Public Sub New(ByVal strRealm As String, ByVal strName As String)
            Me.strRealm = strRealm
            Me.strName = strName
            Load()
        End Sub

        ''' <summary>
        ''' Loads the character from the Armory
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Load()
            Dim strKey As String = String.Format("LibWowArmory.CharacterSheet.{0}.{1}", strRealm, strName)
            If IsNothing(Cache.Cache(strKey)) Then
                MyBase.Retrieve()

                Dim xsSerializer As New XmlSerializer(csPage.GetType())

                Dim srXML As New StringReader(MyBase.strXML)

                csPage = CType(xsSerializer.Deserialize(srXML), CharacterSheetSchema.page)

                Cache.Cache.Insert(strKey, csPage, Nothing, Date.UtcNow.AddDays(1), Nothing, Caching.CacheItemPriority.Normal, Nothing)
            Else
                csPage = CType(Cache.Cache(strKey), CharacterSheetSchema.page)
            End If
        End Sub

#End Region

#Region "Private Methods"

        ''' <summary>
        ''' Returns basic character information
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function GetCharacter() As CharacterSheetSchema.characterInfo_character
            Dim varCharacter = (From c In csPage.characterInfo() Where c.character.Count() > 0 Select c.character.First())
            If varCharacter.Count = 0 Then
                Throw New InvalidOperationException("Character not found.")
            End If
            Return varCharacter.First()
        End Function

        ''' <summary>
        ''' Returns detailed character information
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function GetCharacterTab() As CharacterSheetSchema.characterTab
            Dim varCharacterTab = (From c In csPage.characterInfo() Where c.characterTab.Count() > 0 Select c.characterTab.First())
            If varCharacterTab.Count = 0 Then
                Throw New InvalidOperationException("Character not found.")
            End If
            Return varCharacterTab.First()
        End Function

        ''' <summary>
        ''' Returns the character's bars
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function GetCharacterBars() As CharacterSheetSchema.characterBars
            Dim cCharacterTab As CharacterSheetSchema.characterTab = GetCharacterTab()
            If cCharacterTab.characterBars.Count = 0 Then
                Return Nothing
            Else
                Return cCharacterTab.characterBars.First()
            End If
        End Function

        ''' <summary>
        ''' Returns information on the character's power bar
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function GetSecondBar() As CharacterSheetSchema.secondBar
            Dim cbCharacterBars As CharacterSheetSchema.characterBars = GetCharacterBars()
            If cbCharacterBars.secondBar.Count = 0 Then
                Return Nothing
            Else
                Return cbCharacterBars.secondBar.First()
            End If
        End Function

        ''' <summary>
        ''' Retrieves the color from an 8 character ARGB hexidicmal string
        ''' </summary>
        ''' <param name="strColor"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function GetColorFromHex(ByVal strColor As String) As Color
            Dim mMatch As Match = Regex.Match(strColor, "([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})")
            Return Color.FromArgb(Convert.ToInt32(mMatch.Groups(1).Value, 16), Convert.ToInt32(mMatch.Groups(2).Value, 16), Convert.ToInt32(mMatch.Groups(3).Value, 16), Convert.ToInt32(mMatch.Groups(4).Value, 16))
        End Function

#End Region

#Region "Nested Classes"

        ''' <summary>
        ''' A class that encapsulates an arena team
        ''' </summary>
        ''' <remarks></remarks>
        Public Class ArenaTeam

            Private mMembers As List(Of Member)
            Private intGamesPlayed As Integer
            Private intGamesWon As Integer
            Private intLastSeasonRanking As Integer
            Private strName As String
            Private intRanking As Integer
            Private intRating As Integer
            Private intSeasonGamesPlayed As Integer
            Private intSeasonGamesWon As Integer
            Private intSize As Integer
            Private colEmblemBackground As Color
            Private colEmblemBorderColor As Color
            Private intEmblemBorderStyle As Integer
            Private colEmblemIconColor As Color
            Private intEmblemIconStyle As Integer

            ''' <summary>
            ''' The team's members
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Members() As List(Of Member)
                Get
                    Return mMembers
                End Get
                Set(ByVal value As List(Of Member))
                    mMembers = value
                End Set
            End Property

            ''' <summary>
            ''' The number of games the team has played
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property GamesPlayed() As Integer
                Get
                    Return intGamesPlayed
                End Get
                Set(ByVal value As Integer)
                    intGamesPlayed = value
                End Set
            End Property

            ''' <summary>
            ''' The number of games the team has won
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property GamesWon() As Integer
                Get
                    Return intGamesWon
                End Get
                Set(ByVal value As Integer)
                    intGamesWon = value
                End Set
            End Property

            ''' <summary>
            ''' The team's ranking from last season
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property LastSeasonRanking() As Integer
                Get
                    Return intLastSeasonRanking
                End Get
                Set(ByVal value As Integer)
                    intLastSeasonRanking = value
                End Set
            End Property

            ''' <summary>
            ''' The name of the team
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Name() As String
                Get
                    Return strName
                End Get
                Set(ByVal value As String)
                    strName = value
                End Set
            End Property

            ''' <summary>
            ''' The team's current ranking
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Ranking() As Integer
                Get
                    Return intRanking
                End Get
                Set(ByVal value As Integer)
                    intRanking = value
                End Set
            End Property

            ''' <summary>
            ''' The team's current rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Rating() As Integer
                Get
                    Return intRating
                End Get
                Set(ByVal value As Integer)
                    intRating = value
                End Set
            End Property

            ''' <summary>
            ''' The number of games the team has played this season
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property SeasonGamesPlayed() As Integer
                Get
                    Return intSeasonGamesPlayed
                End Get
                Set(ByVal value As Integer)
                    intSeasonGamesPlayed = value
                End Set
            End Property

            ''' <summary>
            ''' The number of games the team has won this season
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property SeasonGamesWon() As Integer
                Get
                    Return intSeasonGamesWon
                End Get
                Set(ByVal value As Integer)
                    intSeasonGamesWon = value
                End Set
            End Property

            ''' <summary>
            ''' The size of the arena team
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Size() As Integer
                Get
                    Return intSize
                End Get
                Set(ByVal value As Integer)
                    intSize = value
                End Set
            End Property

            ''' <summary>
            ''' The background color of the team's emblem
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property EmblemBackground() As Color
                Get
                    Return colEmblemBackground
                End Get
                Set(ByVal value As Color)
                    colEmblemBackground = value
                End Set
            End Property

            ''' <summary>
            ''' The border color of the team's emblem
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property EmblemBorderColor() As Color
                Get
                    Return colEmblemBorderColor
                End Get
                Set(ByVal value As Color)
                    colEmblemBorderColor = value
                End Set
            End Property

            ''' <summary>
            ''' The border style of the team's emblem
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property EmblemBorderStyle() As Integer
                Get
                    Return intEmblemBorderStyle
                End Get
                Set(ByVal value As Integer)
                    intEmblemBorderStyle = value
                End Set
            End Property

            ''' <summary>
            ''' The icon color of the team's emblem
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property EmblemIconColor() As Color
                Get
                    Return colEmblemIconColor
                End Get
                Set(ByVal value As Color)
                    colEmblemIconColor = value
                End Set
            End Property

            ''' <summary>
            ''' The icon style of the team's emblem
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property EmblemIconStyle() As Integer
                Get
                    Return intEmblemIconStyle
                End Get
                Set(ByVal value As Integer)
                    intEmblemIconStyle = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new arena team information
            ''' </summary>
            ''' <param name="mMembers"></param>
            ''' <param name="intGamesPlayed"></param>
            ''' <param name="intGamesWon"></param>
            ''' <param name="intLastSeasonRanking"></param>
            ''' <param name="strName"></param>
            ''' <param name="intRanking"></param>
            ''' <param name="intRating"></param>
            ''' <param name="intSeasonGamesPlayed"></param>
            ''' <param name="intSeasonGamesWon"></param>
            ''' <param name="intSize"></param>
            ''' <param name="colEmblemBackground"></param>
            ''' <param name="colEmblemBorderColor"></param>
            ''' <param name="intEmblemBorderStyle"></param>
            ''' <param name="colEmblemIconColor"></param>
            ''' <param name="intEmblemIconStyle"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal mMembers As List(Of Member), ByVal intGamesPlayed As Integer, ByVal intGamesWon As Integer, ByVal intLastSeasonRanking As Integer, ByVal strName As String, ByVal intRanking As Integer, ByVal intRating As Integer, ByVal intSeasonGamesPlayed As Integer, ByVal intSeasonGamesWon As Integer, ByVal intSize As Integer, ByVal colEmblemBackground As Color, ByVal colEmblemBorderColor As Color, ByVal intEmblemBorderStyle As Integer, ByVal colEmblemIconColor As Color, ByVal intEmblemIconStyle As Integer)
                Me.mMembers = mMembers
                Me.intGamesPlayed = intGamesPlayed
                Me.intGamesWon = intGamesWon
                Me.intLastSeasonRanking = intLastSeasonRanking
                Me.strName = strName
                Me.intRanking = intRanking
                Me.intRating = intRating
                Me.intSeasonGamesPlayed = intSeasonGamesPlayed
                Me.intSeasonGamesWon = intSeasonGamesWon
                Me.intSize = intSize
                Me.colEmblemBackground = colEmblemBackground
                Me.colEmblemBorderColor = colEmblemBorderColor
                Me.intEmblemBorderStyle = intEmblemBorderStyle
                Me.colEmblemIconColor = colEmblemIconColor
                Me.intEmblemIconStyle = intEmblemIconStyle
            End Sub

            ''' <summary>
            ''' A class that encapsulates an arena team member
            ''' </summary>
            ''' <remarks></remarks>
            Public Class Member

                Private cClass As ClassType
                Private intContribution As Integer
                Private intGamesPlayed As Integer
                Private intGamesWon As Integer
                Private gGender As GenderType
                Private strGuild As String
                Private strName As String
                Private rRace As RaceType
                Private intSeasonGamesPlayed As Integer
                Private intSeasonGamesWon As Integer
                Private blnTeamRank As Boolean

                ''' <summary>
                ''' The class of the team member
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property [Class]() As ClassType
                    Get
                        Return cClass
                    End Get
                    Set(ByVal value As ClassType)
                        cClass = value
                    End Set
                End Property

                ''' <summary>
                ''' The team member's personal rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PersonalRating() As Integer
                    Get
                        Return intContribution
                    End Get
                    Set(ByVal value As Integer)
                        intContribution = value
                    End Set
                End Property

                ''' <summary>
                ''' The number of games the team member played
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property GamesPlayed() As Integer
                    Get
                        Return intGamesPlayed
                    End Get
                    Set(ByVal value As Integer)
                        intGamesPlayed = value
                    End Set
                End Property

                ''' <summary>
                ''' The number of games the team member won
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property GamesWon() As Integer
                    Get
                        Return intGamesWon
                    End Get
                    Set(ByVal value As Integer)
                        intGamesWon = value
                    End Set
                End Property

                ''' <summary>
                ''' The gender of the team member
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Gender() As GenderType
                    Get
                        Return gGender
                    End Get
                    Set(ByVal value As GenderType)
                        gGender = value
                    End Set
                End Property

                ''' <summary>
                ''' The team member's guild
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Guild() As String
                    Get
                        Return strGuild
                    End Get
                    Set(ByVal value As String)
                        strGuild = value
                    End Set
                End Property

                ''' <summary>
                ''' The name of the team member
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Name() As String
                    Get
                        Return strName
                    End Get
                    Set(ByVal value As String)
                        strName = value
                    End Set
                End Property

                ''' <summary>
                ''' The team member's race
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Race() As RaceType
                    Get
                        Return rRace
                    End Get
                    Set(ByVal value As RaceType)
                        rRace = value
                    End Set
                End Property

                ''' <summary>
                ''' The number of games the team member played this season
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property SeasonGamesPlayed() As Integer
                    Get
                        Return intSeasonGamesPlayed
                    End Get
                    Set(ByVal value As Integer)
                        intSeasonGamesPlayed = value
                    End Set
                End Property

                ''' <summary>
                ''' The number of games the team member won this season
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property SeasonGamesWon() As Integer
                    Get
                        Return intSeasonGamesWon
                    End Get
                    Set(ByVal value As Integer)
                        intSeasonGamesWon = value
                    End Set
                End Property

                ''' <summary>
                ''' Determines whether the team member is the team leader
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Leader() As Boolean
                    Get
                        Return blnTeamRank
                    End Get
                    Set(ByVal value As Boolean)
                        blnTeamRank = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new team member information
                ''' </summary>
                ''' <param name="cClass"></param>
                ''' <param name="intContribution"></param>
                ''' <param name="intGamesPlayed"></param>
                ''' <param name="intGamesWon"></param>
                ''' <param name="gGender"></param>
                ''' <param name="strGuild"></param>
                ''' <param name="strName"></param>
                ''' <param name="rRace"></param>
                ''' <param name="intSeasonGamesPlayed"></param>
                ''' <param name="intSeasonGamesWon"></param>
                ''' <param name="blnTeamRank"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal cClass As ClassType, ByVal intContribution As Integer, ByVal intGamesPlayed As Integer, ByVal intGamesWon As Integer, ByVal gGender As GenderType, ByVal strGuild As String, ByVal strName As String, ByVal rRace As RaceType, ByVal intSeasonGamesPlayed As Integer, ByVal intSeasonGamesWon As Integer, ByVal blnTeamRank As Boolean)
                    Me.cClass = cClass
                    Me.intContribution = intContribution
                    Me.intGamesPlayed = intGamesPlayed
                    Me.intGamesWon = intGamesWon
                    Me.gGender = gGender
                    Me.strGuild = strGuild
                    Me.strName = strName
                    Me.rRace = rRace
                    Me.intSeasonGamesPlayed = intSeasonGamesPlayed
                    Me.intSeasonGamesWon = intSeasonGamesWon
                    Me.blnTeamRank = blnTeamRank
                End Sub

            End Class

        End Class

        ''' <summary>
        ''' A class that encapsulates a profession
        ''' </summary>
        ''' <remarks></remarks>
        Public Class Profession

            Dim intMax As Integer
            Dim strName As String
            Dim intSkill As Integer

            ''' <summary>
            ''' The max skill level available to the character in this profession
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Max() As Integer
                Get
                    Return intMax
                End Get
                Set(ByVal value As Integer)
                    intMax = value
                End Set
            End Property

            ''' <summary>
            ''' The name of the profession
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Name() As String
                Get
                    Return strName
                End Get
                Set(ByVal value As String)
                    strName = value
                End Set
            End Property

            ''' <summary>
            ''' The current skill level of the character in this profession
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Skill() As Integer
                Get
                    Return intSkill
                End Get
                Set(ByVal value As Integer)
                    intSkill = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new profession information
            ''' </summary>
            ''' <param name="intMax"></param>
            ''' <param name="strName"></param>
            ''' <param name="intSkill"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal intMax As Integer, ByVal strName As String, ByVal intSkill As Integer)
                Me.intMax = intMax
                Me.strName = strName
                Me.intSkill = intSkill
            End Sub

        End Class

        ''' <summary>
        ''' A class that encapsulates base stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class BaseStats

            Private sStrength As StrengthStats
            Private aAgility As AgilityStats
            Private sStamina As StaminaStats
            Private iIntellect As IntellectStats
            Private sSpirit As SpiritStats
            Private aArmor As ArmorStats

            ''' <summary>
            ''' The character's strength stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Strength() As StrengthStats
                Get
                    Return sStrength
                End Get
                Set(ByVal value As StrengthStats)
                    sStrength = value
                End Set
            End Property

            ''' <summary>
            ''' The character's agility stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Agility() As AgilityStats
                Get
                    Return aAgility
                End Get
                Set(ByVal value As AgilityStats)
                    aAgility = value
                End Set
            End Property

            ''' <summary>
            ''' The character's stamina stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Stamina() As StaminaStats
                Get
                    Return sStamina
                End Get
                Set(ByVal value As StaminaStats)
                    sStamina = value
                End Set
            End Property

            ''' <summary>
            ''' The character's intellect stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Intellect() As IntellectStats
                Get
                    Return iIntellect
                End Get
                Set(ByVal value As IntellectStats)
                    iIntellect = value
                End Set
            End Property

            ''' <summary>
            ''' The character's spirit stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Spirit() As SpiritStats
                Get
                    Return sSpirit
                End Get
                Set(ByVal value As SpiritStats)
                    sSpirit = value
                End Set
            End Property

            ''' <summary>
            ''' The character's armor stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Armor() As ArmorStats
                Get
                    Return aArmor
                End Get
                Set(ByVal value As ArmorStats)
                    aArmor = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new base stats
            ''' </summary>
            ''' <param name="sStrength"></param>
            ''' <param name="aAgility"></param>
            ''' <param name="sStamina"></param>
            ''' <param name="iIntellect"></param>
            ''' <param name="sSpirit"></param>
            ''' <param name="aArmor"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal sStrength As StrengthStats, ByVal aAgility As AgilityStats, ByVal sStamina As StaminaStats, ByVal iIntellect As IntellectStats, ByVal sSpirit As SpiritStats, ByVal aArmor As ArmorStats)
                Me.sStrength = sStrength
                Me.aAgility = aAgility
                Me.sStamina = sStamina
                Me.iIntellect = iIntellect
                Me.sSpirit = sSpirit
                Me.aArmor = aArmor
            End Sub

            ''' <summary>
            ''' A class that encapsulates strength stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class StrengthStats

                Private intAttack As Integer
                Private intBase As Integer
                Private intBlock As Integer
                Private intEffective As Integer

                ''' <summary>
                ''' The character's bonus to attack power from strength
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property AttackPower() As Integer
                    Get
                        Return intAttack
                    End Get
                    Set(ByVal value As Integer)
                        intAttack = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's base strength
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus to block rating from strength
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Block() As Integer
                    Get
                        Return intBlock
                    End Get
                    Set(ByVal value As Integer)
                        intBlock = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total strength
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new strength information
                ''' </summary>
                ''' <param name="intAttack"></param>
                ''' <param name="intBase"></param>
                ''' <param name="intBlock"></param>
                ''' <param name="intEffective"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intAttack As Integer, ByVal intBase As Integer, ByVal intBlock As Integer, ByVal intEffective As Integer)
                    Me.intAttack = intAttack
                    Me.intBase = intBase
                    Me.intBlock = intBlock
                    Me.intEffective = intEffective
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates agility stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class AgilityStats

                Private intArmor As Integer
                Private intAttack As Integer
                Private intBase As Integer
                Private dblCritHitPercent As Double
                Private intEffective As Integer

                ''' <summary>
                ''' The character's bonus to armor from agility
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Armor() As Integer
                    Get
                        Return intArmor
                    End Get
                    Set(ByVal value As Integer)
                        intArmor = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus to attack power from agility
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property AttackPower() As Integer
                    Get
                        Return intAttack
                    End Get
                    Set(ByVal value As Integer)
                        intAttack = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's base agility
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus to physical critical hit chance from agility
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property CritHitPercent() As Double
                    Get
                        Return dblCritHitPercent
                    End Get
                    Set(ByVal value As Double)
                        dblCritHitPercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total agility
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new agility information
                ''' </summary>
                ''' <param name="intArmor"></param>
                ''' <param name="intAttack"></param>
                ''' <param name="intBase"></param>
                ''' <param name="dblCritHitPercent"></param>
                ''' <param name="intEffective"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intArmor As Integer, ByVal intAttack As Integer, ByVal intBase As Integer, ByVal dblCritHitPercent As Double, ByVal intEffective As Integer)
                    Me.intArmor = intArmor
                    Me.intAttack = intAttack
                    Me.intBase = intBase
                    Me.dblCritHitPercent = dblCritHitPercent
                    Me.intEffective = intEffective
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates stamina stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class StaminaStats

                Private intBase As Integer
                Private intEffective As Integer
                Private intHealth As Integer
                Private intPetBonus As Integer

                ''' <summary>
                ''' The character's base stamina
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total stamina
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus health from stamina
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Health() As Integer
                    Get
                        Return intHealth
                    End Get
                    Set(ByVal value As Integer)
                        intHealth = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus stamina given to the character's pet
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PetBonus() As Integer
                    Get
                        Return intPetBonus
                    End Get
                    Set(ByVal value As Integer)
                        intPetBonus = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new stamina information
                ''' </summary>
                ''' <param name="intBase"></param>
                ''' <param name="intEffective"></param>
                ''' <param name="intHealth"></param>
                ''' <param name="intPetBonus"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intBase As Integer, ByVal intEffective As Integer, ByVal intHealth As Integer, ByVal intPetBonus As Integer)
                    Me.intBase = intBase
                    Me.intEffective = intEffective
                    Me.intHealth = intHealth
                    Me.intPetBonus = intPetBonus
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates intellect stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class IntellectStats

                Private intBase As Integer
                Private dblCritHitPercent As Double
                Private intEffective As Integer
                Private intMana As Integer
                Private intPetBonus As Integer

                ''' <summary>
                ''' The character's base intellect
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus to spell critical hit chance from intellect
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property CritHitPercent() As Double
                    Get
                        Return dblCritHitPercent
                    End Get
                    Set(ByVal value As Double)
                        dblCritHitPercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total intellect
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus mana from intellect
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Mana() As Integer
                    Get
                        Return intMana
                    End Get
                    Set(ByVal value As Integer)
                        intMana = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus intellect given to the character's pet
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PetBonus() As Integer
                    Get
                        Return intPetBonus
                    End Get
                    Set(ByVal value As Integer)
                        intPetBonus = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new intellect information
                ''' </summary>
                ''' <param name="intBase"></param>
                ''' <param name="dblCritHitPercent"></param>
                ''' <param name="intEffective"></param>
                ''' <param name="intMana"></param>
                ''' <param name="intPetBonus"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intBase As Integer, ByVal dblCritHitPercent As Double, ByVal intEffective As Integer, ByVal intMana As Integer, ByVal intPetBonus As Integer)
                    Me.intBase = intBase
                    Me.dblCritHitPercent = dblCritHitPercent
                    Me.intEffective = intEffective
                    Me.intMana = intMana
                    Me.intPetBonus = intPetBonus
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates spirit stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class SpiritStats

                Private intBase As Integer
                Private intEffective As Integer
                Private intHealthRegen As Integer
                Private intManaRegen As Integer

                ''' <summary>
                ''' The character's base spirit
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total spirit
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus to health per second from spirit
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property HealthRegen() As Integer
                    Get
                        Return intHealthRegen
                    End Get
                    Set(ByVal value As Integer)
                        intHealthRegen = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus to mana per five seconds from spirit
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property ManaRegen() As Integer
                    Get
                        Return intManaRegen
                    End Get
                    Set(ByVal value As Integer)
                        intManaRegen = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new spirit information
                ''' </summary>
                ''' <param name="intBase"></param>
                ''' <param name="intEffective"></param>
                ''' <param name="intHealthRegen"></param>
                ''' <param name="intManaRegen"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intBase As Integer, ByVal intEffective As Integer, ByVal intHealthRegen As Integer, ByVal intManaRegen As Integer)
                    Me.intBase = intBase
                    Me.intEffective = intEffective
                    Me.intHealthRegen = intHealthRegen
                    Me.intManaRegen = intManaRegen
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates armor stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class ArmorStats

                Private intBase As Integer
                Private intEffective As Integer
                Private dblPercent As Double
                Private intPetBonus As Integer

                ''' <summary>
                ''' The character's base armor
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total armor
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's damage reduction against physical attacks from enemies of the same level from armor
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PercentDamageReduction() As Double
                    Get
                        Return dblPercent
                    End Get
                    Set(ByVal value As Double)
                        dblPercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus armor given to the character's pet
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PetBonus() As Integer
                    Get
                        Return intPetBonus
                    End Get
                    Set(ByVal value As Integer)
                        intPetBonus = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new armor information
                ''' </summary>
                ''' <param name="intBase"></param>
                ''' <param name="intEffective"></param>
                ''' <param name="dblPercent"></param>
                ''' <param name="intPetBonus"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intBase As Integer, ByVal intEffective As Integer, ByVal dblPercent As Double, ByVal intPetBonus As Integer)
                    Me.intBase = intBase
                    Me.intEffective = intEffective
                    Me.dblPercent = dblPercent
                    Me.intPetBonus = intPetBonus
                End Sub

            End Class

        End Class

        ''' <summary>
        ''' A class that encapsulates resistance stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class ResistanceStats

            Private rArcane As Resistance
            Private rFire As Resistance
            Private rFrost As Resistance
            Private rHoly As Resistance
            Private rNature As Resistance
            Private rShadow As Resistance

            ''' <summary>
            ''' The character's resistance to arcane
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Arcane() As Resistance
                Get
                    Return rArcane
                End Get
                Set(ByVal value As Resistance)
                    rArcane = value
                End Set
            End Property

            ''' <summary>
            ''' The character's resistance to fire
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Fire() As Resistance
                Get
                    Return rFire
                End Get
                Set(ByVal value As Resistance)
                    rFire = value
                End Set
            End Property

            ''' <summary>
            ''' The character's resistance to frost
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Frost() As Resistance
                Get
                    Return rFrost
                End Get
                Set(ByVal value As Resistance)
                    rFrost = value
                End Set
            End Property

            ''' <summary>
            ''' The character's resistance to holy
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Holy() As Resistance
                Get
                    Return rHoly
                End Get
                Set(ByVal value As Resistance)
                    rHoly = value
                End Set
            End Property

            ''' <summary>
            ''' The character's resistance to nature
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Nature() As Resistance
                Get
                    Return rNature
                End Get
                Set(ByVal value As Resistance)
                    rNature = value
                End Set
            End Property

            ''' <summary>
            ''' The character's resistance to shadow
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Shadow() As Resistance
                Get
                    Return rShadow
                End Get
                Set(ByVal value As Resistance)
                    rShadow = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new resistance information
            ''' </summary>
            ''' <param name="rArcane"></param>
            ''' <param name="rFire"></param>
            ''' <param name="rFrost"></param>
            ''' <param name="rHoly"></param>
            ''' <param name="rNature"></param>
            ''' <param name="rShadow"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal rArcane As Resistance, ByVal rFire As Resistance, ByVal rFrost As Resistance, ByVal rHoly As Resistance, ByVal rNature As Resistance, ByVal rShadow As Resistance)
                Me.rArcane = rArcane
                Me.rFire = rFire
                Me.rFrost = rFrost
                Me.rHoly = rHoly
                Me.rNature = rNature
                Me.rShadow = rShadow
            End Sub

            ''' <summary>
            ''' A class that encapsulates resistance for a single school of magic
            ''' </summary>
            ''' <remarks></remarks>
            Public Class Resistance

                Private intPetBonus As Integer
                Private intValue As Integer

                ''' <summary>
                ''' The amount of bonus resistance to this school of magic given to the character's pet
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PetBonus() As Integer
                    Get
                        Return intPetBonus
                    End Get
                    Set(ByVal value As Integer)
                        intPetBonus = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's resistance to this school of magic
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Resistance() As Integer
                    Get
                        Return intValue
                    End Get
                    Set(ByVal value As Integer)
                        intValue = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor that creates new resistance information
                ''' </summary>
                ''' <param name="intPetBonus"></param>
                ''' <param name="intValue"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intPetBonus As Integer, ByVal intValue As Integer)
                    Me.intPetBonus = intPetBonus
                    Me.intValue = intValue
                End Sub

            End Class

        End Class

        ''' <summary>
        ''' A class that encapsulates weapon stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class WeaponStats

            Private dblDPS As Double
            Private intMax As Integer
            Private intMin As Integer
            Private intPercent As Integer
            Private dblSpeed As Double
            Private dblHastePercent As Double
            Private intHasteRating As Integer

            ''' <summary>
            ''' The average damage per second done by this weapon
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property DPS() As Double
                Get
                    Return dblDPS
                End Get
                Set(ByVal value As Double)
                    dblDPS = value
                End Set
            End Property

            ''' <summary>
            ''' The maximum damage done by this weapon in one swing
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Max() As Integer
                Get
                    Return intMax
                End Get
                Set(ByVal value As Integer)
                    intMax = value
                End Set
            End Property

            ''' <summary>
            ''' The minimum damage done by this weapon in one swing
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Min() As Integer
                Get
                    Return intMin
                End Get
                Set(ByVal value As Integer)
                    intMin = value
                End Set
            End Property

            ''' <summary>
            ''' An unknown value tracked in the Armory
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Percent() As Integer
                Get
                    Return intPercent
                End Get
                Set(ByVal value As Integer)
                    intPercent = value
                End Set
            End Property

            ''' <summary>
            ''' The speed of the weapon in seconds per swing
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Speed() As Double
                Get
                    Return dblSpeed
                End Get
                Set(ByVal value As Double)
                    dblSpeed = value
                End Set
            End Property

            ''' <summary>
            ''' The haste percent applied to this weapon
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property HastePercent() As Double
                Get
                    Return dblHastePercent
                End Get
                Set(ByVal value As Double)
                    dblHastePercent = value
                End Set
            End Property

            ''' <summary>
            ''' The haste rating applied to this weapon
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property HasteRating() As Integer
                Get
                    Return intHasteRating
                End Get
                Set(ByVal value As Integer)
                    intHasteRating = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new weapon information
            ''' </summary>
            ''' <param name="dblDPS"></param>
            ''' <param name="intMax"></param>
            ''' <param name="intMin"></param>
            ''' <param name="intPercent"></param>
            ''' <param name="dblSpeed"></param>
            ''' <param name="dblHastePercent"></param>
            ''' <param name="intHasteRating"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal dblDPS As Double, ByVal intMax As Integer, ByVal intMin As Integer, ByVal intPercent As Integer, ByVal dblSpeed As Double, ByVal dblHastePercent As Double, ByVal intHasteRating As Integer)
                Me.dblDPS = dblDPS
                Me.intMax = intMax
                Me.intMin = intMin
                Me.intPercent = intPercent
                Me.dblSpeed = dblSpeed
                Me.dblHastePercent = dblHastePercent
                Me.intHasteRating = intHasteRating
            End Sub

        End Class

        ''' <summary>
        ''' A class that encapsulates hit rating stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class HitRatingStats

            Private dblIncreasedHitPercent As Double
            Private intPenetration As Integer
            Private dblReducedArmorPercent As Double
            Private intValue As Integer

            ''' <summary>
            ''' The character's bonus to hit from hit rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property IncreasedHitPercent() As Double
                Get
                    Return dblIncreasedHitPercent
                End Get
                Set(ByVal value As Double)
                    dblIncreasedHitPercent = value
                End Set
            End Property

            ''' <summary>
            ''' The character's armor penetration rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property ArmorPenetrationRating() As Integer
                Get
                    Return intPenetration
                End Get
                Set(ByVal value As Integer)
                    intPenetration = value
                End Set
            End Property

            ''' <summary>
            ''' The character's armor reduction expresed in percent from armor penetration rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property ArmorPenetrationPercent() As Double
                Get
                    Return dblReducedArmorPercent
                End Get
                Set(ByVal value As Double)
                    dblReducedArmorPercent = value
                End Set
            End Property

            ''' <summary>
            ''' The character's hit rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Value() As Integer
                Get
                    Return intValue
                End Get
                Set(ByVal value As Integer)
                    intValue = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new hit rating information
            ''' </summary>
            ''' <param name="dblIncreasedHitPercent"></param>
            ''' <param name="intPenetration"></param>
            ''' <param name="dblReducedArmorPercent"></param>
            ''' <param name="intValue"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal dblIncreasedHitPercent As Double, ByVal intPenetration As Integer, ByVal dblReducedArmorPercent As Double, ByVal intValue As Integer)
                Me.dblIncreasedHitPercent = dblIncreasedHitPercent
                Me.intPenetration = intPenetration
                Me.dblReducedArmorPercent = dblReducedArmorPercent
                Me.intValue = intValue
            End Sub

        End Class

        ''' <summary>
        ''' A class that encapsualtes crit chance stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class CritChanceStats

            Private dblPercent As Double
            Private dblPlusPercent As Double
            Private intRating As Integer

            ''' <summary>
            ''' The character's total crit strike chance
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Percent() As Double
                Get
                    Return dblPercent
                End Get
                Set(ByVal value As Double)
                    dblPercent = value
                End Set
            End Property

            ''' <summary>
            ''' The character's bonus crit strike percentage from crit strike rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property PlusPercent() As Double
                Get
                    Return dblPlusPercent
                End Get
                Set(ByVal value As Double)
                    dblPlusPercent = value
                End Set
            End Property

            ''' <summary>
            ''' The character's crit strike rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Rating() As Integer
                Get
                    Return intRating
                End Get
                Set(ByVal value As Integer)
                    intRating = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new crit chance information
            ''' </summary>
            ''' <param name="dblPercent"></param>
            ''' <param name="dblPlusPercent"></param>
            ''' <param name="intRating"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal dblPercent As Double, ByVal dblPlusPercent As Double, ByVal intRating As Integer)
                Me.dblPercent = dblPercent
                Me.dblPlusPercent = dblPlusPercent
                Me.intRating = intRating
            End Sub

        End Class

        ''' <summary>
        ''' A class that encapsulates melee stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class MeleeStats

            Private wsMainHand As WeaponStats
            Private wsOffHand As WeaponStats
            Private apsAttackPower As AttackPowerStats
            Private hrsHitRating As HitRatingStats
            Private ccsCritChance As CritChanceStats
            Private esExpertise As ExpertiseStats

            ''' <summary>
            ''' The character's melee main hand weapon stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property MainHand() As WeaponStats
                Get
                    Return wsMainHand
                End Get
                Set(ByVal value As WeaponStats)
                    wsMainHand = value
                End Set
            End Property

            ''' <summary>
            ''' The character's melee off hand weapon stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property OffHand() As WeaponStats
                Get
                    Return wsOffHand
                End Get
                Set(ByVal value As WeaponStats)
                    wsOffHand = value
                End Set
            End Property

            ''' <summary>
            ''' The character's melee attack power stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property AttackPower() As AttackPowerStats
                Get
                    Return apsAttackPower
                End Get
                Set(ByVal value As AttackPowerStats)
                    apsAttackPower = value
                End Set
            End Property

            ''' <summary>
            ''' The character's melee hit rating stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property HitRating() As HitRatingStats
                Get
                    Return hrsHitRating
                End Get
                Set(ByVal value As HitRatingStats)
                    hrsHitRating = value
                End Set
            End Property

            ''' <summary>
            ''' The character's melee crit chance stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property CritChance() As CritChanceStats
                Get
                    Return ccsCritChance
                End Get
                Set(ByVal value As CritChanceStats)
                    ccsCritChance = value
                End Set
            End Property

            ''' <summary>
            ''' The character's melee expertise stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Expertise() As ExpertiseStats
                Get
                    Return esExpertise
                End Get
                Set(ByVal value As ExpertiseStats)
                    esExpertise = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new melee stats
            ''' </summary>
            ''' <param name="wsMainHand"></param>
            ''' <param name="wsOffHand"></param>
            ''' <param name="apsAttackPower"></param>
            ''' <param name="hrsHitRating"></param>
            ''' <param name="ccsCritChance"></param>
            ''' <param name="esExpertise"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal wsMainHand As WeaponStats, ByVal wsOffHand As WeaponStats, ByVal apsAttackPower As AttackPowerStats, ByVal hrsHitRating As HitRatingStats, ByVal ccsCritChance As CritChanceStats, ByVal esExpertise As ExpertiseStats)
                Me.wsMainHand = wsMainHand
                Me.wsOffHand = wsOffHand
                Me.apsAttackPower = apsAttackPower
                Me.hrsHitRating = hrsHitRating
                Me.ccsCritChance = ccsCritChance
                Me.esExpertise = esExpertise
            End Sub

            ''' <summary>
            ''' A class that encapsulates attack power stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class AttackPowerStats

                Public intBase As Integer
                Public intEffective As Integer
                Public dblIncreasedDPS As Double

                ''' <summary>
                ''' The character's base attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus damage per second from attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property IncreasedDPS() As Double
                    Get
                        Return dblIncreasedDPS
                    End Get
                    Set(ByVal value As Double)
                        dblIncreasedDPS = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new attack power information
                ''' </summary>
                ''' <param name="intBase"></param>
                ''' <param name="intEffective"></param>
                ''' <param name="dblIncreasedDPS"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intBase As Integer, ByVal intEffective As Integer, ByVal dblIncreasedDPS As Double)
                    Me.intBase = intBase
                    Me.intEffective = intEffective
                    Me.dblIncreasedDPS = dblIncreasedDPS
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates expertise stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class ExpertiseStats

                Private intAdditional As Integer
                Private dblPercent As Double
                Private intRating As Integer
                Private intValue As Integer

                ''' <summary>
                ''' The character's bonus expertise from expertise rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Additional() As Integer
                    Get
                        Return intAdditional
                    End Get
                    Set(ByVal value As Integer)
                        intAdditional = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's reduction in being parried or blocked from expertise
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Percent() As Double
                    Get
                        Return dblPercent
                    End Get
                    Set(ByVal value As Double)
                        dblPercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's expertise rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Rating() As Integer
                    Get
                        Return intRating
                    End Get
                    Set(ByVal value As Integer)
                        intRating = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's expertise
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Value() As Integer
                    Get
                        Return intValue
                    End Get
                    Set(ByVal value As Integer)
                        intValue = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new expertise information
                ''' </summary>
                ''' <param name="intAdditional"></param>
                ''' <param name="dblPercent"></param>
                ''' <param name="intRating"></param>
                ''' <param name="intValue"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intAdditional As Integer, ByVal dblPercent As Double, ByVal intRating As Integer, ByVal intValue As Integer)
                    Me.intAdditional = intAdditional
                    Me.dblPercent = dblPercent
                    Me.intRating = intRating
                    Me.intValue = intValue
                End Sub

            End Class

        End Class

        ''' <summary>
        ''' A class that encapsulates ranged stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class RangedStats

            Private wssWeaponSkill As WeaponSkillStats
            Private wsWeapon As WeaponStats
            Private apsAttackPower As AttackPowerStats
            Private hrsHitRating As HitRatingStats
            Private ccsCritChance As CritChanceStats

            ''' <summary>
            ''' The character's ranged weapon skill stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks>Very likely deprecated, but still exists in the XML file</remarks>
            Public Property WeaponSkill() As WeaponSkillStats
                Get
                    Return wssWeaponSkill
                End Get
                Set(ByVal value As WeaponSkillStats)
                    wssWeaponSkill = value
                End Set
            End Property

            ''' <summary>
            ''' The character's ranged weapon stats
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Weapon() As WeaponStats
                Get
                    Return wsWeapon
                End Get
                Set(ByVal value As WeaponStats)
                    wsWeapon = value
                End Set
            End Property

            ''' <summary>
            ''' The character's ranged attack power
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property AttackPower() As AttackPowerStats
                Get
                    Return apsAttackPower
                End Get
                Set(ByVal value As AttackPowerStats)
                    apsAttackPower = value
                End Set
            End Property

            ''' <summary>
            ''' The character's ranged hit rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property HitRating() As HitRatingStats
                Get
                    Return hrsHitRating
                End Get
                Set(ByVal value As HitRatingStats)
                    hrsHitRating = value
                End Set
            End Property

            ''' <summary>
            ''' The character's ranged crit chance
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property CritChance() As CritChanceStats
                Get
                    Return ccsCritChance
                End Get
                Set(ByVal value As CritChanceStats)
                    ccsCritChance = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new ranged stats information
            ''' </summary>
            ''' <param name="wssWeaponSkill"></param>
            ''' <param name="wsWeapon"></param>
            ''' <param name="apsAttackPower"></param>
            ''' <param name="hrsHitRating"></param>
            ''' <param name="ccsCritChance"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal wssWeaponSkill As WeaponSkillStats, ByVal wsWeapon As WeaponStats, ByVal apsAttackPower As AttackPowerStats, ByVal hrsHitRating As HitRatingStats, ByVal ccsCritChance As CritChanceStats)
                Me.wssWeaponSkill = wssWeaponSkill
                Me.wsWeapon = wsWeapon
                Me.apsAttackPower = apsAttackPower
                Me.hrsHitRating = hrsHitRating
                Me.ccsCritChance = ccsCritChance
            End Sub

            ''' <summary>
            ''' A class that encapsulates weapon skill stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class WeaponSkillStats

                Private intRating As Integer
                Private intValue As Integer

                ''' <summary>
                ''' The character's ranged weapon skill rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Rating() As Integer
                    Get
                        Return intRating
                    End Get
                    Set(ByVal value As Integer)
                        intRating = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's ranged weapon skill
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Value() As Integer
                    Get
                        Return intValue
                    End Get
                    Set(ByVal value As Integer)
                        intValue = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new weapon skill information
                ''' </summary>
                ''' <param name="intRating"></param>
                ''' <param name="intValue"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intRating As Integer, ByVal intValue As Integer)
                    Me.intRating = intRating
                    Me.intValue = intValue
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates attack power stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class AttackPowerStats

                Private intBase As Integer
                Private intEffective As Integer
                Private dblIncreasedDPS As Double
                Private dblPetAttack As Double
                Private dblPetSpell As Double

                ''' <summary>
                ''' The character's base attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Base() As Integer
                    Get
                        Return intBase
                    End Get
                    Set(ByVal value As Integer)
                        intBase = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Effective() As Integer
                    Get
                        Return intEffective
                    End Get
                    Set(ByVal value As Integer)
                        intEffective = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus to damage per second from attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property IncreasedDPS() As Double
                    Get
                        Return dblIncreasedDPS
                    End Get
                    Set(ByVal value As Double)
                        dblIncreasedDPS = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's pet's bonus to attack power from attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PetAttackPower() As Double
                    Get
                        Return dblPetAttack
                    End Get
                    Set(ByVal value As Double)
                        dblPetAttack = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's pet's bonus to spell damage from attack power
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PetSpellDamage() As Double
                    Get
                        Return dblPetSpell
                    End Get
                    Set(ByVal value As Double)
                        dblPetSpell = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new attack power information
                ''' </summary>
                ''' <param name="intBase"></param>
                ''' <param name="intEffective"></param>
                ''' <param name="dblIncreasedDPS"></param>
                ''' <param name="dblPetAttack"></param>
                ''' <param name="dblPetSpell"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intBase As Integer, ByVal intEffective As Integer, ByVal dblIncreasedDPS As Double, ByVal dblPetAttack As Double, ByVal dblPetSpell As Double)
                    Me.intBase = intBase
                    Me.intEffective = intEffective
                    Me.dblIncreasedDPS = dblIncreasedDPS
                    Me.dblPetAttack = dblPetAttack
                    Me.dblPetSpell = dblPetSpell
                End Sub

            End Class

        End Class

        ''' <summary>
        ''' A class that encapsulates spell stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class SpellStats

            Private spsSpellPower As SpellPowerStats
            Private intPetAttackPower As Integer
            Private intPetSpellDamage As Integer
            Private strPetSpellType As String
            Private shrSpellHitRating As SpellHitRatingStats
            Private sccSpellCritChance As SpellCritChanceStats
            Private dblManaRegenWhileCasting As Double
            Private dblManaRegenWhileNotCasting As Double
            Private dblHastePercent As Double
            Private intHasteRating As Integer

            ''' <summary>
            ''' The character's spell power
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property SpellPower() As SpellPowerStats
                Get
                    Return spsSpellPower
                End Get
                Set(ByVal value As SpellPowerStats)
                    spsSpellPower = value
                End Set
            End Property

            ''' <summary>
            ''' The character's pet's bonus to attack power
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property PetAttackPower() As Integer
                Get
                    Return intPetAttackPower
                End Get
                Set(ByVal value As Integer)
                    intPetAttackPower = value
                End Set
            End Property

            ''' <summary>
            ''' The character's pet's bonus to spell damage
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property PetSpellDamage() As Integer
                Get
                    Return intPetSpellDamage
                End Get
                Set(ByVal value As Integer)
                    intPetSpellDamage = value
                End Set
            End Property

            ''' <summary>
            ''' The spell power type used to determine the character's pet's increase in attack power and spell damage
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property PetSpellType() As String
                Get
                    Return strPetSpellType
                End Get
                Set(ByVal value As String)
                    strPetSpellType = value
                End Set
            End Property

            ''' <summary>
            ''' The character's spell hit rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property HitRating() As SpellHitRatingStats
                Get
                    Return shrSpellHitRating
                End Get
                Set(ByVal value As SpellHitRatingStats)
                    shrSpellHitRating = value
                End Set
            End Property

            ''' <summary>
            ''' The character's spell crit chance
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property CritChance() As SpellCritChanceStats
                Get
                    Return sccSpellCritChance
                End Get
                Set(ByVal value As SpellCritChanceStats)
                    sccSpellCritChance = value
                End Set
            End Property

            ''' <summary>
            ''' The character's mana per five seconds while casting
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property ManaRegenWhileCasting() As Double
                Get
                    Return dblManaRegenWhileCasting
                End Get
                Set(ByVal value As Double)
                    dblManaRegenWhileCasting = value
                End Set
            End Property

            ''' <summary>
            ''' The character's mana per five seconds while not casting
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property ManaRegenWhileNotCasting() As Double
                Get
                    Return dblManaRegenWhileNotCasting
                End Get
                Set(ByVal value As Double)
                    dblManaRegenWhileNotCasting = value
                End Set
            End Property

            ''' <summary>
            ''' The character's spell haste percent
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property HastePercent() As Double
                Get
                    Return dblHastePercent
                End Get
                Set(ByVal value As Double)
                    dblHastePercent = value
                End Set
            End Property

            ''' <summary>
            ''' The character's spell haste rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property HasteRating() As Integer
                Get
                    Return intHasteRating
                End Get
                Set(ByVal value As Integer)
                    intHasteRating = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new spell information
            ''' </summary>
            ''' <param name="spsSpellPower"></param>
            ''' <param name="intPetAttackPower"></param>
            ''' <param name="intPetSpellDamage"></param>
            ''' <param name="strPetSpellType"></param>
            ''' <param name="shrSpellHitRating"></param>
            ''' <param name="sccSpellCritChance"></param>
            ''' <param name="dblManaRegenWhileCasting"></param>
            ''' <param name="dblManaRegenWhileNotCasting"></param>
            ''' <param name="dblHastePercent"></param>
            ''' <param name="intHasteRating"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal spsSpellPower As SpellPowerStats, ByVal intPetAttackPower As Integer, ByVal intPetSpellDamage As Integer, ByVal strPetSpellType As String, ByVal shrSpellHitRating As SpellHitRatingStats, ByVal sccSpellCritChance As SpellCritChanceStats, ByVal dblManaRegenWhileCasting As Double, ByVal dblManaRegenWhileNotCasting As Double, ByVal dblHastePercent As Double, ByVal intHasteRating As Integer)
                Me.spsSpellPower = spsSpellPower
                Me.intPetAttackPower = intPetAttackPower
                Me.intPetSpellDamage = intPetSpellDamage
                Me.strPetSpellType = strPetSpellType
                Me.shrSpellHitRating = shrSpellHitRating
                Me.sccSpellCritChance = sccSpellCritChance
                Me.dblManaRegenWhileCasting = dblManaRegenWhileCasting
                Me.dblManaRegenWhileNotCasting = dblManaRegenWhileNotCasting
                Me.dblHastePercent = dblHastePercent
                Me.intHasteRating = intHasteRating
            End Sub

            ''' <summary>
            ''' A class that encapsulates spell power
            ''' </summary>
            ''' <remarks></remarks>
            Public Class SpellPowerStats

                Private intArcane As Integer
                Private intFire As Integer
                Private intFrost As Integer
                Private intHoly As Integer
                Private intNature As Integer
                Private intShadow As Integer
                Private intHealing As Integer

                ''' <summary>
                ''' The amount of bonus arcane damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Arcane() As Integer
                    Get
                        Return intArcane
                    End Get
                    Set(ByVal value As Integer)
                        intArcane = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus fire damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Fire() As Integer
                    Get
                        Return intFire
                    End Get
                    Set(ByVal value As Integer)
                        intFire = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus frost damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Frost() As Integer
                    Get
                        Return intFrost
                    End Get
                    Set(ByVal value As Integer)
                        intFrost = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus holy damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Holy() As Integer
                    Get
                        Return intHoly
                    End Get
                    Set(ByVal value As Integer)
                        intHoly = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus nature damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Nature() As Integer
                    Get
                        Return intNature
                    End Get
                    Set(ByVal value As Integer)
                        intNature = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus shadow damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Shadow() As Integer
                    Get
                        Return intShadow
                    End Get
                    Set(ByVal value As Integer)
                        intShadow = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount of bonus healing
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Healing() As Integer
                    Get
                        Return intHealing
                    End Get
                    Set(ByVal value As Integer)
                        intHealing = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new spell power information
                ''' </summary>
                ''' <param name="intArcane"></param>
                ''' <param name="intFire"></param>
                ''' <param name="intFrost"></param>
                ''' <param name="intHoly"></param>
                ''' <param name="intNature"></param>
                ''' <param name="intShadow"></param>
                ''' <param name="intHealing"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intArcane As Integer, ByVal intFire As Integer, ByVal intFrost As Integer, ByVal intHoly As Integer, ByVal intNature As Integer, ByVal intShadow As Integer, ByVal intHealing As Integer)
                    Me.intArcane = intArcane
                    Me.intFire = intFire
                    Me.intFrost = intFrost
                    Me.intHoly = intHoly
                    Me.intNature = intNature
                    Me.intShadow = intShadow
                    Me.intHealing = intHealing
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates spell hit rating
            ''' </summary>
            ''' <remarks></remarks>
            Public Class SpellHitRatingStats

                Private dblIncreasedHitPercent As Double
                Private intPenetration As Integer
                Private intReducedResist As Integer
                Private intValue As Integer

                ''' <summary>
                ''' The character's bonus spell hit from spell hit rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property IncreasedHitPercent() As Double
                    Get
                        Return dblIncreasedHitPercent
                    End Get
                    Set(ByVal value As Double)
                        dblIncreasedHitPercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's spell penetration rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Penetration() As Integer
                    Get
                        Return intPenetration
                    End Get
                    Set(ByVal value As Integer)
                        intPenetration = value
                    End Set
                End Property

                ''' <summary>
                ''' The amount that an enemy's spell resistances are reduced from spell penetration
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property ReducedResistance() As Integer
                    Get
                        Return intReducedResist
                    End Get
                    Set(ByVal value As Integer)
                        intReducedResist = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's spell hit rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Value() As Integer
                    Get
                        Return intValue
                    End Get
                    Set(ByVal value As Integer)
                        intValue = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new spell hit rating information
                ''' </summary>
                ''' <param name="dblIncreasedHitPercent"></param>
                ''' <param name="intPenetration"></param>
                ''' <param name="intReducedResist"></param>
                ''' <param name="intValue"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal dblIncreasedHitPercent As Double, ByVal intPenetration As Integer, ByVal intReducedResist As Integer, ByVal intValue As Integer)
                    Me.dblIncreasedHitPercent = dblIncreasedHitPercent
                    Me.intPenetration = intPenetration
                    Me.intReducedResist = intReducedResist
                    Me.intValue = intValue
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates spell crit chance
            ''' </summary>
            ''' <remarks></remarks>
            Public Class SpellCritChanceStats

                Private intRating As Integer
                Private dblArcane As Double
                Private dblFire As Double
                Private dblFrost As Double
                Private dblHoly As Double
                Private dblNature As Double
                Private dblShadow As Double

                ''' <summary>
                ''' The character's spell crit rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Rating() As Integer
                    Get
                        Return intRating
                    End Get
                    Set(ByVal value As Integer)
                        intRating = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's chance to crit with arcane damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Arcane() As Double
                    Get
                        Return dblArcane
                    End Get
                    Set(ByVal value As Double)
                        dblArcane = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's chance to crit with fire damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Fire() As Double
                    Get
                        Return dblFire
                    End Get
                    Set(ByVal value As Double)
                        dblFire = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's chance to crit with frost damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Frost() As Double
                    Get
                        Return dblFrost
                    End Get
                    Set(ByVal value As Double)
                        dblFrost = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's chance to crit with holy damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Holy() As Double
                    Get
                        Return dblHoly
                    End Get
                    Set(ByVal value As Double)
                        dblHoly = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's chance to crit with nature damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Nature() As Double
                    Get
                        Return dblNature
                    End Get
                    Set(ByVal value As Double)
                        dblNature = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's chance to crit with shadow damage
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Shadow() As Double
                    Get
                        Return dblShadow
                    End Get
                    Set(ByVal value As Double)
                        dblShadow = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new spell crit chance information
                ''' </summary>
                ''' <param name="intRating"></param>
                ''' <param name="dblArcane"></param>
                ''' <param name="dblFire"></param>
                ''' <param name="dblFrost"></param>
                ''' <param name="dblHoly"></param>
                ''' <param name="dblNature"></param>
                ''' <param name="dblShadow"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal intRating As Integer, ByVal dblArcane As Double, ByVal dblFire As Double, ByVal dblFrost As Double, ByVal dblHoly As Double, ByVal dblNature As Double, ByVal dblShadow As Double)
                    Me.intRating = intRating
                    Me.dblArcane = dblArcane
                    Me.dblFire = dblFire
                    Me.dblFrost = dblFrost
                    Me.dblHoly = dblHoly
                    Me.dblNature = dblNature
                    Me.dblShadow = dblShadow
                End Sub

            End Class

        End Class

        ''' <summary>
        ''' A class that encapsulates defensive stats
        ''' </summary>
        ''' <remarks></remarks>
        Public Class DefensiveStats

            Private dsDefense As DefenseStats
            Private asDodge As AvoidanceStats
            Private asParry As AvoidanceStats
            Private asBlock As AvoidanceStats
            Private rsResilience As ResilienceStats

            ''' <summary>
            ''' The character's defense rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Defense() As DefenseStats
                Get
                    Return dsDefense
                End Get
                Set(ByVal value As DefenseStats)
                    dsDefense = value
                End Set
            End Property

            ''' <summary>
            ''' The character's dodge rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Dodge() As AvoidanceStats
                Get
                    Return asDodge
                End Get
                Set(ByVal value As AvoidanceStats)
                    asDodge = value
                End Set
            End Property

            ''' <summary>
            ''' The character's parry rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Parry() As AvoidanceStats
                Get
                    Return asParry
                End Get
                Set(ByVal value As AvoidanceStats)
                    asParry = value
                End Set
            End Property

            ''' <summary>
            ''' The character's block rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Block() As AvoidanceStats
                Get
                    Return asBlock
                End Get
                Set(ByVal value As AvoidanceStats)
                    asBlock = value
                End Set
            End Property

            ''' <summary>
            ''' The character's resilience rating
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Resilience() As ResilienceStats
                Get
                    Return rsResilience
                End Get
                Set(ByVal value As ResilienceStats)
                    rsResilience = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new defensive information
            ''' </summary>
            ''' <param name="dsDefense"></param>
            ''' <param name="asDodge"></param>
            ''' <param name="asParry"></param>
            ''' <param name="asBlock"></param>
            ''' <param name="rsResilience"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal dsDefense As DefenseStats, ByVal asDodge As AvoidanceStats, ByVal asParry As AvoidanceStats, ByVal asBlock As AvoidanceStats, ByVal rsResilience As ResilienceStats)
                Me.dsDefense = dsDefense
                Me.asDodge = asDodge
                Me.asParry = asParry
                Me.asBlock = asBlock
                Me.rsResilience = rsResilience
            End Sub

            ''' <summary>
            ''' A class that encapsulates defense stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class DefenseStats

                Private dblDecreasePercent As Double
                Private dblIncreasePercent As Double
                Private intPlusDefense As Integer
                Private intRating As Integer
                Private dblValue As Double

                ''' <summary>
                ''' The character's bonus reduction in being hit and critically hit from defense skill
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property DecreasePercent() As Double
                    Get
                        Return dblDecreasePercent
                    End Get
                    Set(ByVal value As Double)
                        dblDecreasePercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus dodge, block, and parry from defense skill
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property IncreasePercent() As Double
                    Get
                        Return dblIncreasePercent
                    End Get
                    Set(ByVal value As Double)
                        dblIncreasePercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's bonus defense skill from defense rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property PlusDefense() As Integer
                    Get
                        Return intPlusDefense
                    End Get
                    Set(ByVal value As Integer)
                        intPlusDefense = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's defense rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Rating() As Integer
                    Get
                        Return intRating
                    End Get
                    Set(ByVal value As Integer)
                        intRating = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's total defense skill
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Value() As Double
                    Get
                        Return dblValue
                    End Get
                    Set(ByVal value As Double)
                        dblValue = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new defense information
                ''' </summary>
                ''' <param name="dblDecreasePercent"></param>
                ''' <param name="dblIncreasePercent"></param>
                ''' <param name="intPlusDefense"></param>
                ''' <param name="intRating"></param>
                ''' <param name="dblValue"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal dblDecreasePercent As Double, ByVal dblIncreasePercent As Double, ByVal intPlusDefense As Integer, ByVal intRating As Integer, ByVal dblValue As Double)
                    Me.dblDecreasePercent = dblDecreasePercent
                    Me.dblIncreasePercent = dblIncreasePercent
                    Me.intPlusDefense = intPlusDefense
                    Me.intRating = intRating
                    Me.dblValue = dblValue
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates an avoidance stat
            ''' </summary>
            ''' <remarks></remarks>
            Public Class AvoidanceStats

                Private dblIncreasePercent As Double
                Private dblPercent As Double
                Private intRating As Integer

                ''' <summary>
                ''' The character's bonus percent chance from this avoidance stat's rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property IncreasePercent() As Double
                    Get
                        Return dblIncreasePercent
                    End Get
                    Set(ByVal value As Double)
                        dblIncreasePercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's percent chance for this avoidance stat
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Percent() As Double
                    Get
                        Return dblPercent
                    End Get
                    Set(ByVal value As Double)
                        dblPercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's rating for this avoidance stat
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Rating() As Integer
                    Get
                        Return intRating
                    End Get
                    Set(ByVal value As Integer)
                        intRating = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new avoidance information
                ''' </summary>
                ''' <param name="dblIncreasePercent"></param>
                ''' <param name="dblPercent"></param>
                ''' <param name="intRating"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal dblIncreasePercent As Double, ByVal dblPercent As Double, ByVal intRating As Integer)
                    Me.dblIncreasePercent = dblIncreasePercent
                    Me.dblPercent = dblPercent
                    Me.intRating = intRating
                End Sub

            End Class

            ''' <summary>
            ''' A class that encapsulates resilience stats
            ''' </summary>
            ''' <remarks></remarks>
            Public Class ResilienceStats

                Private dblDamagePercent As Double
                Private dblHitPercent As Double
                Private dblValue As Double

                ''' <summary>
                ''' The character's reduction in mana drain effects and critical strike damage from resilience rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property DamagePercent() As Double
                    Get
                        Return dblDamagePercent
                    End Get
                    Set(ByVal value As Double)
                        dblDamagePercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's reduction in periodic damage and chance to be critically hit from resilience rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property HitPercent() As Double
                    Get
                        Return dblHitPercent
                    End Get
                    Set(ByVal value As Double)
                        dblHitPercent = value
                    End Set
                End Property

                ''' <summary>
                ''' The character's resilience rating
                ''' </summary>
                ''' <value></value>
                ''' <returns></returns>
                ''' <remarks></remarks>
                Public Property Value() As Double
                    Get
                        Return dblValue
                    End Get
                    Set(ByVal value As Double)
                        dblValue = value
                    End Set
                End Property

                ''' <summary>
                ''' A constructor to create new resilience information
                ''' </summary>
                ''' <param name="dblDamagePercent"></param>
                ''' <param name="dblHitPercent"></param>
                ''' <param name="dblValue"></param>
                ''' <remarks></remarks>
                Public Sub New(ByVal dblDamagePercent As Double, ByVal dblHitPercent As Double, ByVal dblValue As Double)
                    Me.dblDamagePercent = dblDamagePercent
                    Me.dblHitPercent = dblHitPercent
                    Me.dblValue = dblValue
                End Sub

            End Class

        End Class

        ''' <summary>
        ''' A class that encapsulates an item
        ''' </summary>
        ''' <remarks></remarks>
        Public Class Item

            Private intDurability As Integer
            Private intGem0ID As Integer
            Private intGem1ID As Integer
            Private intGem2ID As Integer
            Private strIcon As String
            Private intID As Integer
            Private intMaxDurability As Integer
            Private intPermanentEnchant As Integer
            Private intRandomPropertiesID As Integer
            Private intSeed As Integer
            Private intSlot As Integer

            ''' <summary>
            ''' The item's current durability
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Durability() As Integer
                Get
                    Return intDurability
                End Get
                Set(ByVal value As Integer)
                    intDurability = value
                End Set
            End Property

            ''' <summary>
            ''' The ID of the gem in the 1st slot of the item
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Gem0ID() As Integer
                Get
                    Return intGem0ID
                End Get
                Set(ByVal value As Integer)
                    intGem0ID = value
                End Set
            End Property

            ''' <summary>
            ''' The ID of the gem in the 2nd slot of the item
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Gem1ID() As Integer
                Get
                    Return intGem1ID
                End Get
                Set(ByVal value As Integer)
                    intGem1ID = value
                End Set
            End Property

            ''' <summary>
            ''' The ID of the gem in the 3rd slot of the item
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Gem2ID() As Integer
                Get
                    Return intGem2ID
                End Get
                Set(ByVal value As Integer)
                    intGem2ID = value
                End Set
            End Property

            ''' <summary>
            ''' The icon of the item
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Icon() As String
                Get
                    Return strIcon
                End Get
                Set(ByVal value As String)
                    strIcon = value
                End Set
            End Property

            ''' <summary>
            ''' The item's identification number
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property ItemID() As Integer
                Get
                    Return intID
                End Get
                Set(ByVal value As Integer)
                    intID = value
                End Set
            End Property

            ''' <summary>
            ''' The maximum durability of the item
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property MaxDurability() As Integer
                Get
                    Return intMaxDurability
                End Get
                Set(ByVal value As Integer)
                    intMaxDurability = value
                End Set
            End Property

            ''' <summary>
            ''' The ID of the permanent enchantment on the item
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property PermanentEnchantID() As Integer
                Get
                    Return intPermanentEnchant
                End Get
                Set(ByVal value As Integer)
                    intPermanentEnchant = value
                End Set
            End Property

            ''' <summary>
            ''' The item's seed
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks>Not sure what this is.</remarks>
            Public Property Seed() As Integer
                Get
                    Return intSeed
                End Get
                Set(ByVal value As Integer)
                    intSeed = value
                End Set
            End Property

            ''' <summary>
            ''' The equipped slot of the item
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Slot() As Integer
                Get
                    Return intSlot
                End Get
                Set(ByVal value As Integer)
                    intSlot = value
                End Set
            End Property

            ''' <summary>
            ''' A constructor to create new item information
            ''' </summary>
            ''' <param name="intDurability"></param>
            ''' <param name="intGem0ID"></param>
            ''' <param name="intGem1ID"></param>
            ''' <param name="intGem2ID"></param>
            ''' <param name="strIcon"></param>
            ''' <param name="intID"></param>
            ''' <param name="intMaxDurability"></param>
            ''' <param name="intPermanentEnchant"></param>
            ''' <param name="intRandomPropertiesID"></param>
            ''' <param name="intSeed"></param>
            ''' <param name="intSlot"></param>
            ''' <remarks></remarks>
            Public Sub New(ByVal intDurability As Integer, ByVal intGem0ID As Integer, ByVal intGem1ID As Integer, ByVal intGem2ID As Integer, ByVal strIcon As String, ByVal intID As Integer, ByVal intMaxDurability As Integer, ByVal intPermanentEnchant As Integer, ByVal intRandomPropertiesID As Integer, ByVal intSeed As Integer, ByVal intSlot As Integer)
                Me.intDurability = intDurability
                Me.intGem0ID = intGem0ID
                Me.intGem1ID = intGem1ID
                Me.intGem2ID = intGem2ID
                Me.strIcon = strIcon
                Me.intID = intID
                Me.intMaxDurability = intMaxDurability
                Me.intPermanentEnchant = intPermanentEnchant
                Me.intRandomPropertiesID = intRandomPropertiesID
                Me.intSeed = intSeed
                Me.intSlot = intSlot
            End Sub

            ''' <summary>
            ''' Gets the item's information
            ''' </summary>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function GetItem() As ItemInfo
                If intID = 0 Then
                    Return Nothing
                Else
                    Return New ItemInfo(intID)
                End If
            End Function

            ''' <summary>
            ''' Gets the item information from one of the gems in this item
            ''' </summary>
            ''' <param name="intGemSlot">The slot of the gem, either 0, 1, or 2.</param>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function GetGem(ByVal intGemSlot As Integer) As ItemInfo
                Dim intGem As Integer
                Select Case intGemSlot
                    Case 0
                        intGem = intGem0ID
                    Case 1
                        intGem = intGem1ID
                    Case 2
                        intGem = intGem2ID
                    Case Else
                        Throw New ArgumentException("You can only get a gem in slots 0, 1, or 2.")
                End Select
                If intGem = 0 Then
                    Return Nothing
                Else
                    Return New ItemInfo(intGem)
                End If
            End Function

        End Class

#End Region

    End Class

End Namespace